package com.example.music.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.music.model.Lovemusic;
import com.example.music.model.Music;
import com.example.music.model.User;
import com.example.music.service.LovemusicService;
import com.example.music.service.MusicService;
import com.example.music.service.UserService;
import com.example.music.utils.Constant;
import com.example.music.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/**
 * Created with IntelliJ IDEA.
 * ClassName: MusicController
 * Package: com.example.music.controller
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-05-29
 * Time: 19:53
 */
@Api(tags = "音乐模块接口")
@RestController
@RequestMapping("/music")
public class MusicController {

    //配置文件读取固定路径
    @Value("${music.local.path}")
    private String SAVE_PATH;

    @Autowired
    private MusicService musicService;

    @Autowired
    private LovemusicService lovemusicService;

    @Autowired
    private UserService userService;

    //音乐上传模块
    /**
     * 请求
     * post，
     * /music/upload
     * 歌手 和 音频文件
     * {String singer,MultipartFile file},
     */
    /**
     * 响应
     * "status":"上传成功！",
     * "data":true
     */
    @ApiOperation("上传音乐")
    @PostMapping("/upload")
    public Result<Boolean> upload(@ApiParam("音乐歌手") String singer,
                                  @ApiParam("音频文件") MultipartFile file,
                                  HttpSession session,
                                  HttpServletResponse response) throws IOException {
        /**
         * 首先判断当前是否登录 Session判断 也可以配置拦截器
         */

        //通过Session拿到当前上传的用户
        //测试的时候 先登录在上传 不然就是空指针异常
        User user = (User) session.getAttribute(Constant.USERINFO_SESSION_KET);

        if (user == null){
            return new Result<>(-1,"Session过期",false);
        }


        //1.获取到文件的原始名 包括后缀
        String fileName = file.getOriginalFilename();
        //2.设置保存的路径
        String path = SAVE_PATH;

        //3.IO文件熟悉
        File dest = new File(path);

        //判断目录是否存在
        if (!dest.exists()){
            dest.mkdirs();
        }

        //4.文件上传
        try {
            //接收到的文件传输到指定位置
            file.transferTo(new File(SAVE_PATH + fileName));
            //return new Result<>(0,"上传成功",true);
        } catch (IOException e) {
            e.printStackTrace();
            return new Result<>(-1,"上传失败",false);
        }

        //5.完成数据上传
        //歌名 数据中的歌名不包括后缀 substring截取字符串 从0下标开始 lastIndexOf返沪最后出现字符的位置
        String title = fileName.substring(0,fileName.lastIndexOf("."));
        //上传的时间 系统生成
        ///SimpleDateFormat 这是格式化当前系统时间
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        String time = sf.format(new Date());
        //上传路径 音乐播放的路径
        String url = "/music/get?path="+title;

        //上传的是音乐
        Music music = new Music();
        music.setTitle(title);
        music.setUserid(user.getId());
        music.setTime(time);
        music.setUrl(url);
        music.setSinger(singer);

        Boolean ret = musicService.save(music);
        if (!ret){
            //数据上传失败要删除服务器的
            dest.delete();
            return new Result<>(-1,"数据库上传失败",false);
        }
        //重定向
        response.sendRedirect("/list.html");
        return new Result<>(0,"服务器和数据上传成功",true);

    }


    //音乐播放模块 相当于文件下载
    /**
     * 请求
     * get,
     * /music/get?path=****.mp3
     */
    /**
     * 响应
     * 音乐数据本身字节信息
     */
    @GetMapping("/get")
    @ApiOperation("播放歌曲接口")
    public ResponseEntity<byte[]> getMusic(@ApiParam("播放路径") String path){
        //path是歌曲的名称 和数据中存储的一模一样

        //创建字节数组
        try {
            //Files。readAllBytes读取文件中所有的字节，读入内存 参数是文件路径
            byte[] bytes = Files.readAllBytes(new File(SAVE_PATH + File.separator + path).toPath());
            return ResponseEntity.ok(bytes);
            //ResponseEntity是Spring封装的响应 ok方法有两个 有参和无参
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    //删除音乐 单个删除
    /**
     * 请求
     * post
     * /music/delete
     * id[]
     */
    /**
     * 响应
     * "status":0,
     * "message":"批量删除成功",
     * "data":true
     */
    @PostMapping("/delete")
    @ApiOperation("删除音乐接口")
    public Result<Boolean> deleteMusic(@ApiParam("删除音乐id") @RequestParam("id[]") List<Integer> id){
        //1.首先去查找是否存在该歌曲
        //批量删除 就循环操作而已
        int sum = 0;
        for (int i = 0; i < id.size(); i++) {
            Music music = musicService.getById(id.get(i));
            if (music == null){
                return new Result<>(-1,"没有你要删除的歌曲",false);
            }
            //2.删除数据库中的歌曲
            boolean b = musicService.removeById(id.get(i));
            if (b){
                //3.删除服务器数据
                //首先拿到歌曲的名称 拼接上后缀
                String title = music.getTitle() + ".mp3";
                File file = new File(SAVE_PATH + title);
                System.out.println(file);
                if (file.delete()){
                    //同步删除喜欢列表中的歌曲
                    QueryWrapper<Lovemusic> queryWrapper = new QueryWrapper<>();
                    queryWrapper.eq("music_id",id.get(i));
                    lovemusicService.remove(queryWrapper);
                    sum += 1;
                    //return new Result<>(0,"服务器和数据库删除成功",true);
                }else {
                    return new Result<>(-1,"服务器删除失败",false);
                }
            }else {
                return new Result<>(-1,"数据删除音乐失败",false);
            }
        }

        if (sum == id.size()){
            System.out.println("全部删除成功");
            return new Result<>(0,"全部删除成功",true);
        }

        return new Result<>(-1,"全部删除失败",false);

    }


    //查询音乐模块 支持模糊查询
    /**
     * 请求
     * get,
     * /music/findmusic,
     * data;{musicName:musicName}
     */
    /**
     * 响应
     * "status":0,
     * "message":“查询到了歌曲信息”,
     * "data":[
     *          {
     *              "id":19,
     *              "title":"烟花易冷",
     *              "url":"/music/get?=烟花易冷",
     *              "time":"2023-5-30",
     *              "userId":3
     *          },
     *          {},{},{}
     *        ]
     */
    @GetMapping("/findMusic")
    @ApiOperation("查询音乐模块")
    public Result<List<Music>> findMusic(@ApiParam("音乐名称") @RequestParam(required = false) String musicName){
        //表示 次参数可以为空 required = false
        List<Music> music = null;
        QueryWrapper<Music> queryWrapper = new QueryWrapper<>();
        if (musicName != null){
            queryWrapper.like("title",musicName);
            music = musicService.list(queryWrapper);
        }else {
            //默认查询所有歌曲
            music = musicService.list();
        }
        return new Result<>(0,"查询到的所有歌曲",music);
    }



}
